/**
 * 常见错误大致分为几类：
 *
 * 1. 可以归因到用户传入参数的错误，返回 400 BAD_REQUEST
 * 2. 程序中的内部参数错误，这时返回 500 INTERNAL_SERVER_ERROR
 * 3. 上面两种错误都是可以从业务逻辑中捕获的。如果出现业务逻辑之外的错误 返回 503 SERVICE_UNAVAILABLE
 */
package com.xyzwps.mvckotlin.exception

import org.springframework.http.HttpStatus
import org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR
import org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE
import org.springframework.http.HttpStatus.BAD_REQUEST

class BizException constructor(
        val code: ErrorCode,
        message: String = "未处理的异常",
        val httpStatus: HttpStatus = INTERNAL_SERVER_ERROR)
    : RuntimeException(message)

fun unhandled() = BizException(ErrorCode.UNHANDLED)

fun badRequest(message: String) = BizException(ErrorCode.BAB_REQUEST, message, BAD_REQUEST)
fun invalidReqArgs(message: String) = BizException(ErrorCode.INVALID_REQ_ARGS, message, BAD_REQUEST)

fun illegalParam(paramName: String) = BizException(ErrorCode.ILLEGAL_PARAM, "非法参数: $paramName", SERVICE_UNAVAILABLE)
fun userExists(username: String) = BizException(ErrorCode.USER_EXISTS, "用户 $username 已存在", SERVICE_UNAVAILABLE)